﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using AdminModule.IndexMarkServiceReference;
using AdminModule.CommonClasses;
using System.Collections.ObjectModel;

namespace AdminModule.Views
{
    public enum ButtonType { Add, Replace };

    /// <summary>
    /// Выбор названия типа добавляемого элемента (например, Раздел, Показатель, отдел и т.п.).
    ///  Если в списке всего лишь один элемент - сразу открывает окно выбора объектов
    /// </summary>
    public partial class SelectAddTypeWindow : ChildWindow, IAddObjectSelector
    {
        private TypeInfo selectedType;
        
        private IAddObjectSelector objectsListWindow;
        private IEnumerable<DTOBase> existsItems;

        // Количество элементов в списке. Вычисляется к конструкторе
        private int itemsCount;

        #region Сохраненные параметры констуктора
        private IEnumerable<TypeInfo> TypeInfoItems;
        private bool isMultipleSelect;
        private bool includeItems;
        #endregion

        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="selectedItem">Объет, в который будут добавлены элементы</param>
        /// <param name="TypeInfoItems">Коллекция объектов TypeInfo (какие объекты могут быть добавлены)</param>
        /// <param name="isMultipleSelect">true - можно выбрать несколько элементов, false - можно выбрать только один элемент</param>
        /// <param name="includeItems">true - отображать уже существующие дочерние элементы объекта selectedItem</param>
        public SelectAddTypeWindow(DTOBase selectedItem, IEnumerable<TypeInfo> TypeInfoItems, ButtonType buttonType,
            bool isMultipleSelect, bool includeItems)
        {
            InitializeComponent();

            IEnumerable<TypeInfo> tmp = new List<TypeInfo>();

            switch (buttonType)
            {
                case ButtonType.Add:
                    tmp = TypeInfoItems.Where(item => item.forParentTypesAdd.Contains(selectedItem.GetType()));
                    break;
                case ButtonType.Replace:
                    tmp = TypeInfoItems.Where(item => item.forParentTypesReplace.Contains(selectedItem.GetType()));
                    break;
            }
            
            this.itemsCount = tmp.Count();
            this.itemList.ItemsSource = tmp;
            this.TypeInfoItems = TypeInfoItems;
            // Если переданный объект содержит потомков - извлекаем их
            this.existsItems = (selectedItem is DTOChilds) ? (selectedItem as DTOChilds).Childs : new ObservableCollection<DTOBase>();
            this.isMultipleSelect = isMultipleSelect;
            this.includeItems = includeItems;
        }

        private void OKButton_Click(object sender, RoutedEventArgs e)
        {
            // ПроверимЮ выбрал ли пользователь один из пунктов
            if (selectedType == null)
            {
                MessageBox.Show("Выберите один из пунктов", MyAssemblyInfo.Title, MessageBoxButton.OK);
                return;
            }

            this.objectsListWindow = selectedType.window;
            if (selectedType.window != null)
            {
                selectedType.window.Closed += (s, ev) =>
                    {
                        //this.DialogResult = (selectedType.window as ChildWindow).DialogResult;
                        if ((selectedType.window as ChildWindow).DialogResult == true/* || itemsCount == 1*/)
                        {
                            this.DialogResult = true;
                        }
                    };
                selectedType.window.ShowForm(existsItems, isMultipleSelect, includeItems);
                return;
            }

            this.DialogResult = true;
        }

        private void CancelButton_Click(object sender, RoutedEventArgs e)
        {
            this.DialogResult = false;
        }

        private void typeRadioButton_Click(object sender, RoutedEventArgs e)
        {
            RadioButton tb = sender as RadioButton;
            selectedType = tb.Tag as TypeInfo;
        }

        public DTOBase GetObject()
        {
            return this.objectsListWindow.GetObject();
        }

        public IEnumerable<DTOBase> GetObjects()
        {
            return this.objectsListWindow.GetObjects();
        }

        private void ChildWindow_Loaded(object sender, RoutedEventArgs e)
        {
            // Если в списке всего один элемент - то незачем предлагать ему выбрать тип объекта
            if (itemsCount == 1)
            {
                selectedType = itemList.Items.First() as TypeInfo;
                OKButton_Click(sender, e);
            }
        }
    }
}

